//this file was only licensed within a separate project,
//TreeN was licensed as a project and has been pulled out of this application due to conflicting communication
//it would be onerous to rebuild WowoGeometry and the other graphics projects licensed to CyberneticImmortality.com
//so hopefully communication can be obtained for licensing a 3d graphics addon for this project.
using System;
using System.Net;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using Microsoft.Win32;

namespace FileHelper
{
    public class FileIO<T>
    {
        public OpenFileDialog openFileDialog1 = new OpenFileDialog();
        public SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        public String lastUsedFileName="";
        
        public void Open(ref T InData)
        {
            if (openFileDialog1.ShowDialog() == true)
            {
                OpenWithKnownFilename(ref InData, openFileDialog1.FileName);
            }
            lastUsedFileName = openFileDialog1.FileName;
            return;
        }

        public void Save(ref T InApp)
        {
            Save(ref InApp, lastUsedFileName);
        }

        public void Save(ref T InApp, String path)
        {
            if (path == "")
            {
                SaveAs(ref InApp);
            }
            else
            {
                SaveWithKnownFilename(InApp, path);
            }

        }

        public String Filter
        {
            set
            {
                openFileDialog1.Filter = "Symbolic Computation Application Files (*.sca)|*.sca";
                saveFileDialog1.Filter = "Symbolic Computation Application Files (*.sca)|*.sca";
            }
        }

        public void SaveAs(ref T InApp)
        {
            if (saveFileDialog1.ShowDialog() == true)
            {
                SaveWithKnownFilename(InApp, saveFileDialog1.FileName);
            }
            lastUsedFileName = saveFileDialog1.FileName;
            return;
        }

        public void OpenWithKnownFilename(ref T InApp, String InFileName)
        {
            XmlSerializer lSerializer = new XmlSerializer(InApp.GetType());
            XmlReader xr = XmlReader.Create(InFileName);
            InApp = (T)lSerializer.Deserialize(xr);
        }

        public void SaveWithKnownFilename(T InApp, String FileName)
        {
            XmlSerializer lSerializer = new XmlSerializer(InApp.GetType());
            XmlWriter lWriter = XmlWriter.Create(FileName);
            lSerializer.Serialize(lWriter, InApp);
        }

    }
}